/*
 * Vector4.h
 *
 *  Created on: 2011/06/24
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_MATH_VECTOR4_H
#define INCLUDED_NTENGINE_MATH_VECTOR4_H

namespace NTEngine {
namespace Math {
class Vector3;

/**
 * @brief 4Dベクタ
 *       ほとんどGPU転送用です。アプリケーション側から
 *       計算に使用することはまずないと思うので最小限のメンバで構成
 */
class Vector4 {
public:
	float x, y, z, w;

	Vector4(){ }
	explicit Vector4( float );
	Vector4( float x, float y, float z, float w = 1.f );
	Vector4( const Vector4& );
	explicit Vector4( const Vector3& );

	void operator=( const Vector4& );
	void operator=( const Vector3& );
	float& operator[]( int );
	float operator[]( int ) const;

	float operator*( const Vector4& ) const; // 内積

	/**
	 * @brief 一括設定します
	 */
	void set( float x, float y, float z, float w );

	/**
	 * @brief 3D版一括設定します
	 */
	void set( float x, float y, float z );

	void madd( const float*, float );

	/**
	 * @brief ベクタの大きさです
	 */
	float length() const;

	/**
	 * @brief ベクタの大きさの２乗を取得します
	 */
	float squareLength() const;
};

} // namespace Math
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_MATH_VECTOR4_H
